/**
 * @brief 针对TCP，UDP，串口等通讯需要通讯过程需要的基础通讯模块。使用epoll的异步通讯方式
 * @version 1.0
 * @author 宋炜
 * @date 2023-6-13
 */

#pragma once
#include <sys/epoll.h>

#include <atomic>
#include <mutex>

#include "misc.hpp"
#include "designM/observer.hpp"
#include "designM/singleton.hpp"
#include "mallocSharedPtr.hpp"
#include "dataCh.hpp"

class epoll : public mandaravaItfc
{
public:
	
private:
	std::atomic< int >      m_id__;             // epoll id
	std::atomic< int >      m_max__;
	std::atomic< size_t >   m_counts__;         // 检测的通道数量
	std::atomic< bool >     m_is_running__;     // 当前是否正在运行
	epoll_event             pt_events__[512];
	std::mutex              m_mutex__;	
	
	std::unordered_map< int , dataCh * >     m_channels__;
private:
	/**
	 * @brief 实际后端运行的线程。用来持续的读取数据
	 * @param ovt[ I ], 等候超时时间
	 */
	void backend__( long ovt );  
public:
	epoll( int maxevts );
	virtual ~epoll();
	/**
	 * @brief 添加数据通道。添加数据通道前，通道必须是已经打开完成的
	 * @param ch[ I ], 通道描述指针
	 * @return 成功操作返回true,否则返回false
	 */
	bool addChannel( dataCh * ch ) final;
	/**
	 * @brief 删除通道
	 */
	bool eraseChannel( dataCh * ch ) final;
	/**
	 * @brief 启动运行或者停止运行
	 * @param sw[ I ], 开关
	 * @param overtime[ I ], 等候超时时间
	 */
	void run( bool sw , long overtime = 200 ) final;
};
